From 633e2dfceb0bd8dae135058eead337395167c55a Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Sun, 3 Sep 2017 16:03:13 +0200 Subject: [PATCH] babl: abstract space duplicate detection --- babl/babl-icc.c | 45 +++++++++++++++++--------------------------- babl/babl-internal.h | 8 ++++++++ babl/babl-space.c | 31 ++++++++++++++++++++++++++++++ babl/babl.h | 4 +--- 4 files changed, 57 insertions(+), 31 deletions(-) diff --git a/babl/babl-icc.c b/babl/babl-icc.c index 3fa24e9..2682fcd 100644 --- a/babl/babl-icc.c +++ b/babl/babl-icc.c @@ -635,6 +635,7 @@ babl_space_from_icc (const char *icc_data, const char *int_err; char *descr = NULL; char *copyright = NULL; + Babl *ret = NULL; sign_t profile_class, color_space; @@ -748,25 +749,16 @@ babl_space_from_icc (const char *icc_data, wY = icc_read (s15f16, offset + 8 + 4); wZ = icc_read (s15f16, offset + 8 + 4 * 2); - if (trc_red == babl_trc ("sRGB") && - trc_green == babl_trc ("sRGB") && - trc_blue == babl_trc ("sRGB") && - fabs(rx - 0.436042) < 0.001 && - fabs(ry - 0.222492) < 0.001 && - fabs(rz - 0.013916) < 0.001 && - fabs(gx - 0.385122) < 0.001 && - fabs(gy - 0.716915) < 0.001 && - fabs(gz - 0.097063) < 0.001 && - fabs(bx - 0.143053) < 0.001 && - fabs(by - 0.060609) < 0.001 && - fabs(bz - 0.713939) < 0.001) + ret = (void*)babl_space_match_trc_matrix (trc_red, trc_green, trc_blue, + rx, ry, rz, gx, gy, gz, bx, by, bz); + if (ret) { babl_free (state); - return babl_space ("sRGB"); + return ret; } { - Babl *ret = (void*)babl_space_from_rgbxyz_matrix (NULL, + ret = (void*)babl_space_from_rgbxyz_matrix (NULL, wX, wY, wZ, rx, gx, bx, ry, gy, by, @@ -792,7 +784,7 @@ babl_space_from_icc (const char *icc_data, if (phosporant != 0) { - *error = "unhandled phosporants, please report bug"; + *error = "unhandled phosporants, please report bug against babl with profile"; return NULL; } if (channels != 3) @@ -815,19 +807,16 @@ babl_space_from_icc (const char *icc_data, double wZ = icc_read (s15f16, offset + 8 + 4 * 2); babl_free (state); - { - Babl *ret = (void*) babl_space_from_chromaticities (NULL, - wX / (wX + wY + wZ), - wY / (wX + wY + wZ), - red_x, red_y, - green_x, green_y, - blue_x, blue_y, - trc_red, trc_green, trc_blue); - ret->space.description = descr; - ret->space.copyright = copyright; - return ret; - } - + ret = (void*) babl_space_from_chromaticities (NULL, + wX / (wX + wY + wZ), + wY / (wX + wY + wZ), + red_x, red_y, + green_x, green_y, + blue_x, blue_y, + trc_red, trc_green, trc_blue); + ret->space.description = descr; + ret->space.copyright = copyright; + return ret; } } diff --git a/babl/babl-internal.h b/babl/babl-internal.h index 6593862..ca65279 100644 --- a/babl/babl-internal.h +++ b/babl/babl-internal.h @@ -362,4 +362,12 @@ void _babl_space_add_universal_rgb (const Babl *space); const Babl * babl_trc_formula_srgb (double gamma, double a, double b, double c, double d); + +const Babl *babl_space_match_trc_matrix (const Babl *trc_red, + const Babl *trc_green, + const Babl *trc_blue, + float rx, float ry, float rz, + float gx, float gy, float gz, + float bx, float by, float bz); + #endif diff --git a/babl/babl-space.c b/babl/babl-space.c index 8ed8465..20ce40c 100644 --- a/babl/babl-space.c +++ b/babl/babl-space.c @@ -772,3 +772,34 @@ void _babl_space_add_universal_rgb (const Babl *space) babl_space_class_for_each (add_rgb_adapter, (void*)space); } + +const Babl *babl_space_match_trc_matrix (const Babl *trc_red, + const Babl *trc_green, + const Babl *trc_blue, + float rx, float ry, float rz, + float gx, float gy, float gz, + float bx, float by, float bz) +{ + // XXX: extend to iteratre through registered spaces and finding + // already registered ones that are close enough duplicates + // first registered space (thus also internal babl ones) wins. + // this makes using babl to get icc meta data difficult, perhaps + // the icc meta data should be passed out-of-band? + + if (trc_red == babl_trc ("sRGB") && + trc_green == babl_trc ("sRGB") && + trc_blue == babl_trc ("sRGB") && + fabs(rx - 0.436042) < 0.001 && + fabs(ry - 0.222492) < 0.001 && + fabs(rz - 0.013916) < 0.001 && + fabs(gx - 0.385122) < 0.001 && + fabs(gy - 0.716915) < 0.001 && + fabs(gz - 0.097063) < 0.001 && + fabs(bx - 0.143053) < 0.001 && + fabs(by - 0.060609) < 0.001 && + fabs(bz - 0.713939) < 0.001) + { + return babl_space ("sRGB"); + } + return NULL; +} diff --git a/babl/babl.h b/babl/babl.h index 3527a60..01431a0 100644 --- a/babl/babl.h +++ b/babl/babl.h @@ -92,12 +92,10 @@ const Babl * babl_trc (const char *name); * babl_trc_gamma: * * Creates a Babl TRC for a specific gamma value, it will be given - * a name + * a name that is a short string representation of the value. */ const Babl * babl_trc_gamma (double gamma); - - /** * babl_space: * -- 2.30.2